%% @author diana
%% @doc @todo Add description to test.


-module(maxteilsummeMatrix).

%% ====================================================================
%% API functions
%% ====================================================================
-export([maxSumme/1]).



%% ====================================================================
%% Internal functions
%% ====================================================================

%% Die Methode liefert eine Liste aller Teilsummen mit entsprechenden Indizes in der Dreieck Matrix
%% Iteration durch i, tailrekursive Aufruf von "tailMatrix()"

maxSumme([H|T]) -> maxSumme([H|T], [], 0, 0, [0,{}]).
maxSumme([], Akk, _, _, MaxSumme) -> lists:flatten(MaxSumme);
maxSumme([H|T],Akk, I, J, MaxSumme) -> case hd(tl(sumMatrix([H|T], I + 1, J))) > hd(MaxSumme) of
									true -> maxSumme(T,Akk ++ hd(sumMatrix([H|T], I + 1, J)), I + 1, J + 1, 
													  [hd(tl(sumMatrix([H|T], I + 1, J)))]);
									false -> maxSumme(T,Akk ++ hd(sumMatrix([H|T], I + 1, J)), I + 1, J + 1, 
													  MaxSumme) end.
	
	

%% Iteration durch j
sumMatrix([H|T], I, J) -> sumMatrix([H|T], 0, [], [0, {}], I, J).
sumMatrix([], _, Akku2, MaxSumme, _, _) -> [[Akku2], MaxSumme];
sumMatrix([H|T], Akku1, Akku2, MaxSumme, I, J) -> case Akku1 + H > hd(MaxSumme) of
											true ->	sumMatrix(T, (Akku1 + H), Akku2 ++ [{Akku1 + H, {I, J + 1}}], 
														   [Akku1 + H, {I, J + 1}], I, J + 1);
											false -> sumMatrix(T, (Akku1 + H), Akku2 ++ [{Akku1 + H, {I, J + 1}}], 
														   MaxSumme, I, J + 1) end.	

%% Aus der Summen Matrix wird MaxSumme ausgesucht, die entsprechende Indizes werden ausgegeben
%%maxSumme([H|T]) -> maxSumme(lists:flatten(maxSumme([H|T])), 0, []).
%%maxSumme([], MaxSumme, Index) -> {MaxSumme, Index};
%%maxSumme([H|T], MaxSumme, Index) ->  case hd(tuple_to_list(H)) > MaxSumme of
%%										  true -> maxSumme(T, hd(tuple_to_list(H)), hd(tl(tuple_to_list(H))));
%%										  false -> maxSumme(T, MaxSumme, Index) end.

%% Zeitmessung
zeitmessung(File) -> timer:tc(maxteilsummeMatrix,maxSumme,
							  [read_file:fileIntoIntlist(read_file:fileToString(File))]).

%% [1,2,3,-4,5,-1,-2] -> {7,{1,5}}.




